<?php

class CargaMasivaHorarioCatedraticoParser extends CargaMasivaParser{

	private $areas;
	private $id_ciclo;
	private $cursos=array();
	private $catedratico_map=array(
			'codigo_curso'=>'A',
			'nombre_curso'=>'B',
			'seccion'=>'C',
			'edificio'=>'D',
			'salon'=>'E',
			'hora_inicio'=>'F',
			'hora_fin'=>'G',
			'lunes'=>'H',
			'martes'=>'I',
			'miercoles'=>'J',
			'jueves'=>'K',
			'viernes'=>'L',
			'sabado'=>'M',
			'registro_personal_catedratico'=>'N',
			'nombre_catedratico'=>'O'
	);

	var $dia_map=array('lunes'=>1,'martes'=>2,'miercoles'=>3,'jueves'=>4,'viernes'=>5,'sabado'=>6);

	var $area_map=array('nombre_area'=>'A','coordinador_area'=>'A');
	var  $tipo_fila_map=array('area'=>0,'coordinador'=>1,'catedratico'=>3);

	public function __construct($path_archivo,$id_ciclo){
		parent::__construct($path_archivo);
		$this->id_ciclo=$id_ciclo;
	}

	public function parse(){
		foreach(($this->cursos) as $codigo_curso=>$curso_secciones){
			$nombre_curso=$curso_secciones['nombre_curso'];
			$curso=Curso::model()->find("codigo_curso=:codigo_curso",array(':codigo_curso'=>$codigo_curso));
			if(!isset($curso)){
				//Si el curso no existe necesitamos crearlo
				$curso=new Curso();
				$curso->codigo_curso=$codigo_curso;
				$curso->nombre=$nombre_curso;
				/*Buscamos el area al que pertenece*/
				$descripcionArea=$curso_secciones['nombre_area'];
				$area=Area::model()->find('descripcion=:descripcion',array(':descripcion'=>$descripcionArea));
				if(isset($area)){
					$curso->id_area=$area->id;
					if(!$curso->save()){
						throw new Exception("No se pudo guardar el curso, por favor verifiquee la descripcion de las areas codigo de curso:".$codigo_curso);
					}
				}
				else{
					throw new Exception("El area $descripcionArea no existe  en la base de datos por favor verifique");
				}
				
			}
			
			foreach($curso_secciones['secciones'] as $seccion_horarios){
				$registro_personal=$seccion_horarios['registro_personal_catedratico'];
				$vseccion=strtoupper($seccion_horarios['seccion']);
				//Verificamos que la seccion existe
				$seccion=Seccion::model()->find('descripcion=:seccion',array(':seccion'=>$vseccion));
				if(!isset($seccion)){
					$seccion=new Seccion();
					$seccion->descripcion=$vseccion;
					$seccion->save();
				}

				//Con estos datos ya podemos crear un ciclo para un curso para una seccion
				$cursoCiclo=new CursoCiclo();
				$cursoCiclo->id_ciclo=$this->id_ciclo;
				$cursoCiclo->id_curso=$curso->id;
				$cursoCiclo->id_seccion=$seccion->id;
				$cursoCiclo->save();
					
				if($registro_personal!=""){
					//Verficamos si el catedratico existe para asisgnarlo al curso ciclo si no lo creamos
					$catedratico=Catedratico::model()->find('registro_personal=:registro_personal',array(':registro_personal'=>$registro_personal));
					if(!isset($catedratico)){
						$datos_catedratico['datos_personales']['nombre']=$seccion_horarios['nombre_catedratico'];
						$datos_catedratico['datos_catedratico']['registro_personal']=$registro_personal;
						$datos_catedratico['datos_usuario']['password']=Yii::app()->authUtil->generatePassword();
						$id_catedratico=Catedratico::model()->guardarCatedratico($datos_catedratico);
						$catedratico=Catedratico::model()->findByPk($id_catedratico);
					}
					//Asignamos el catedratico
					$cursoCiclo->asignarParticipante($catedratico->id_rol_partido);
				}
					
				//buscamos una instancia del tipo de horario CLASE
				$tipoHorario=TipoHorario::model()->find('nombre=:nombre',array(':nombre'=>'CLASE'));
				//nota:el tipo de horario debio haber sido precargado
				/*Ahora almacenamos todos los horarios para el curso*/
				foreach ($seccion_horarios['horarios'] as $datos_horario){
					$vedificio=strtoupper($datos_horario['edificio']);
					$edificio=Edificio::model()->find('descripcion=:edificio',array(':edificio'=>$vedificio));
					$salon=$datos_horario['salon'];
					$hora_inicio=$datos_horario['hora_inicio'];
					$hora_fin=$datos_horario['hora_fin'];
					if(!isset($edificio)){
						$edificio=new Edificio();
						$edificio->descripcion=$vedificio;
						$edificio->save();
					}
					$horario=new Horario();
					$horario->id_curso_ciclo=$cursoCiclo->id;
					$horario->id_tipo_horario=$tipoHorario->id;
					$horario->id_edificio=$edificio->id;
					$horario->salon=$salon;
					$horario->hora_inicio=$hora_inicio;
					$horario->hora_fin=$hora_fin;
					$horario->save();
					//Ahora guardamos el detalle de cada horario
					foreach ($datos_horario['detalle_horario'] as $datos_detalle){
						$dia=$datos_detalle['dia'];
						$detalleHorario=new DetalleHorario();
						$detalleHorario->id_horario=$horario->id;
						$detalleHorario->dia=$dia;
						$detalleHorario->save();
					}
				}


			}
				
		}
	}




	/*Hace una validacion del archivo y genera un array de cursos agrupados por codigo de curso
	 * ver el var_dump($cursos) para darse una mejor idea de lo que el array contiene
	*/
	public function validarArchivo(){
		$resultado=true;
		$resultadoError='';
		$areaActual=array();
		$contador=0;
		/*El fin de recorrer el array es para encontrar cada uno de los horarios y secciones de los diferentes cursos*/
		foreach ($this->archivo as $linea){
			if(isset($linea)&&count($linea)>0){
				if($linea['A']!=null){
					$areas=array();
					$textoPrimeraCelda=strtolower(trim($linea['A']));

					if(preg_match('/rea:/',$textoPrimeraCelda,$matches) ){//contiene area de los cursos
						//Linea de area
						$datos_area=explode(':',$textoPrimeraCelda);
						$areaActual['nombre_area']=trim(strtoupper($datos_area[1]));
					}
					else if(preg_match('/^coordinador/',$textoPrimeraCelda)){
						if(isset($areaActual['nombre_area'])){
							$datos_cooridinador=explode(':',$textoPrimeraCelda);
							$areaActual['coordinador']=$datos_cooridinador[1];
						}
						else{

							$resultadoError=$this->mensajeError("Debe especificar un area para el  $textoPrimeraCelda", $contador);
							throw  new Exception($resultadoError);
						}
					}
					else if(is_numeric($textoPrimeraCelda)){
						$codigo_curso=trim($linea[$this->catedratico_map['codigo_curso']]);
						$seccion=trim($linea[$this->catedratico_map['seccion']]);
						$horarioActual=array();
						$horarioActual['edificio']=trim($linea[$this->catedratico_map['edificio']]);
						$horarioActual['salon'] =trim($linea[$this->catedratico_map['salon']]);							
						$hora_inicio=$linea[$this->catedratico_map['hora_inicio']];
						$hora_fin=$linea[$this->catedratico_map['hora_fin']];
						$horarioActual['hora_inicio']=$hora_inicio;
						$horarioActual['hora_fin']=$hora_fin;
						foreach($this->dia_map as $dia=>$numero_dia){
							//buscamos el indice de la columna en la que esta el dia
							$indice_dia=$this->catedratico_map[$dia];
							//Si la columna esta marcada con X
							$dia_marcado=strtolower(trim($linea[$indice_dia]))=='x'?true:false;
							if($dia_marcado){
								$dia_horario['dia']=$numero_dia;
								$horarioActual['detalle_horario'][]=$dia_horario;
							}
						}
						//si la seccion de un curso ya existe solo se agrega el horario a su array de horarios
						if(isset($this->cursos[$codigo_curso]['secciones'][$seccion])){
							$curso_seccion=$this->cursos[$codigo_curso][$seccion];						
							$curso_seccion['horarios'][]=$horarioActual;
							$this->cursos[$codigo_curso]['secciones'][]=$curso_seccion;
						}
						else{//Si no existe se crea el la seccion del curso y se almacena en el array de secciones por curso
							$curso_seccion=array();
							$curso_seccion['codigo_curso']=$codigo_curso;								
							$curso_seccion['seccion']=$seccion;
							$curso_seccion['nombre_curso']=trim($linea[$this->catedratico_map['nombre_curso']]);
							$curso_seccion['registro_personal_catedratico']=trim($linea[$this->catedratico_map['registro_personal_catedratico']]);
							$curso_seccion['nombre_catedratico']=trim($linea[$this->catedratico_map['nombre_catedratico']]);
							$curso_seccion['horarios']=array();
							$curso_seccion['horarios'][]=$horarioActual;
							//Almacenamos datos importantes del curso y sus respectivas secciones (se van agregando por cada iteracion)
							$this->cursos[$codigo_curso]['nombre_curso']=$curso_seccion['nombre_curso'];
							$this->cursos[$codigo_curso]['nombre_area']=$areaActual['nombre_area'];
							$this->cursos[$codigo_curso]['codigo_curso']=$curso_seccion['codigo_curso'];
							$this->cursos[$codigo_curso]['secciones'][]=$curso_seccion;

						}							
					}
				}
				$contador++;
			}
		}
// 			var_dump($this->cursos);die();

		return $resultado;
	}



}